package com.metaera.app.data.network;

import com.metaera.app.data.model.ActivityListResponse;
import com.metaera.app.data.model.AppConfigResponse;
import com.metaera.app.data.model.ArticleListResponse;
import com.metaera.app.data.model.BasicListResponse;
import com.metaera.app.data.model.BasicResponse;
import com.metaera.app.data.model.CollectionListResponse;
import com.metaera.app.data.model.FeedbackResponse;
import com.metaera.app.data.model.FollowAuthorResponse;
import com.metaera.app.data.model.HistoryListResponse;
import com.metaera.app.data.model.HomeNewsTypeResponse;
import com.metaera.app.data.model.HomeTopNewsResponse;
import com.metaera.app.data.model.HotColumnResponse;
import com.metaera.app.data.model.HotSearchResponse;
import com.metaera.app.data.model.InformationDetailsResponse;
import com.metaera.app.data.model.InvestFinanceResponse;
import com.metaera.app.data.model.MorningPostResponse;
import com.metaera.app.data.model.NoticeListResponse;
import com.metaera.app.data.model.PhoneCodeResponse;
import com.metaera.app.data.model.ProfileResponse;
import com.metaera.app.data.model.SearchResponse;
import com.metaera.app.data.model.SearchResultResponse;
import com.metaera.app.data.model.SpecialDetailsResponse;
import com.metaera.app.data.model.SpecialResponse;
import com.metaera.app.data.model.TodayEventResponse;
import com.metaera.app.data.model.UploadImageResponse;
import com.metaera.app.data.model.UserDetailsResponse;
import com.metaera.app.data.model.UserNoticeResponse;
import com.metaera.app.data.model.VersionUpInfoResponse;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PartMap;
import retrofit2.http.Query;

public interface WebServiceApi {

    /**
     * 上传图片
     * <p>
     * 文件名称 file
     */
    @Multipart
    @POST("/upload")
    Observable<BasicResponse<UploadImageResponse>> upload(@PartMap Map<String, RequestBody> files);


    /**
     * 获取手机区号
     */
    @POST("/getPhoneCode")
    Observable<BasicResponse<List<PhoneCodeResponse>>> getPhoneCode();


    /**
     * 登录
     *
     * @param type 1密码登陆, 2验证码登陆注册
     */
    @FormUrlEncoded
    @POST("/login")
    Observable<BasicResponse<UserDetailsResponse>> login(
            @Field("type") int type,
            @Field("code") String code,
            @Field("mobile") String mobile,
            @Field("password") String password,
            @Field("phone_code") String phone_code
    );

    /**
     * 绑定微信
     */
    @FormUrlEncoded
    @POST("/bindMobile")
    Observable<BasicResponse<UserDetailsResponse>> bindMobile(
            @Field("code") String code,
            @Field("mobile") String mobile,
            @Field("phone_code") String phone_code,
            @Header("Authorization") String token
    );

    /**
     * 发送短信
     */
    @FormUrlEncoded
    @POST("/sendSms")
    Observable<BasicResponse<Object>> sendSms(
            @Field("phone_code") String code,
            @Field("phone") String mobile
    );


    /**
     * 获取用户信息
     */
    @POST("/getUserInfo")
    Observable<BasicResponse<UserDetailsResponse>> getUserInfo();

    /**
     * 个人主页
     */
    @FormUrlEncoded
    @POST("/toUserInfo")
    Observable<BasicResponse<ProfileResponse>> toUserInfo(@Field("id") int id);

    /**
     * 设置新密码
     */
    @FormUrlEncoded
    @POST("/setPassword")
    Observable<BasicResponse<Object>> setPassword(
            @Field("code") String code,
            @Field("mobile") String mobile,
            @Field("phone_code") String phone_code,
            @Field("new_password1") String password1,
            @Field("new_password2") String password2
    );

    /**
     * 忘记密码
     */
    @FormUrlEncoded
    @POST("/forgotPassword")
    Observable<BasicResponse<Object>> forgotPassword(
            @Field("code") String code,
            @Field("mobile") String mobile,
            @Field("phone_code") String phone_code,
            @Field("new_password1") String password1,
            @Field("new_password2") String password2
    );


    /**
     * 修改用户信息
     *
     * @param is_show_phone 是否显示手机号1-是 0-否
     */
    @FormUrlEncoded
    @POST("/editUserInfo")
    Observable<BasicResponse<Object>> editUserInfo(
            @Field("nickname") String nickname,
            @Field("avatar_img") String avatar_img,
            @Field("sex") String sex,
            @Field("position") String position,
            @Field("desc") String desc,
            @Field("weibo") String weibo,
            @Field("official_account") String official_account,
            @Field("twitter") String twitter,
            @Field("email") String email,
            @Field("is_show_phone") String is_show_phone,
            @Field("phone") String phone,
            @Field("knowledge_planet") String knowledge_planet,
            @Field("is_show_wechat") String is_show_wechat,
            @Field("wechat") String wechat
    );


//    /**
//     * 修改密码
//     */
//    @FormUrlEncoded
//    @POST("/setPassword")
//    Observable<BasicResponse<UserDetailsResponse>> setPassword(
//            @Field("code") String code,
//            @Field("new_password1") String new_password1,
//            @Field("new_password2") String new_password2
//    );

    /**
     * 首页头条
     */
    @GET("/homeLinsts")
    Observable<BasicResponse<HomeTopNewsResponse>> homeTopNews();


    /**
     * 首页分类
     *
     * @param type 类别：1-首页分类；2-快讯分类；3-日历分类
     */
    @GET("/categoryLists")
    Observable<BasicResponse<List<HomeNewsTypeResponse>>> categoryLists(
            @Query("type") int type
    );

    /**
     * 金色早八点
     */
    @FormUrlEncoded
    @POST("/getNewsDetails")
    Observable<BasicListResponse<MorningPostResponse>> getNewsDetails(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 投融资
     */
    @FormUrlEncoded
    @POST("/getInvestDetails")
    Observable<BasicListResponse<InvestFinanceResponse>> getInvestDetails(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 今日大事件
     */
    @FormUrlEncoded
    @POST("/getEventDetails")
    Observable<BasicListResponse<TodayEventResponse>> getEventDetails(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 精选专题
     */
    @FormUrlEncoded
    @POST("/getSpecial")
    Observable<BasicResponse<SpecialResponse>> getSpecial(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 根据类别获取资讯
     *
     * @param category_id 类别ID（0查全部）
     * @param type        类型 1-首页；2-快讯
     */
    @FormUrlEncoded
    @POST("/getArticleList")
    Observable<BasicListResponse<ArticleListResponse>> getArticleList(
            @Field("category_id") int category_id,
            @Field("type") int type,
            @Field("page") int page,
            @Field("size") int size
    );


    /**
     * 热门搜索
     */
    @POST("/hotSearch")
    Observable<BasicResponse<List<HotSearchResponse>>> hotSearch();

    /**
     * 日历查询
     */
    @FormUrlEncoded
    @POST("/calendarList")
    Observable<BasicResponse<List<String>>> calendarList(
            @Field("date") String date,
            @Field("category_id") int categoryID
    );

    /**
     * 日历列表
     */
    @FormUrlEncoded
    @POST("/appointDateCalendar")
    Observable<BasicListResponse<ArticleListResponse>> appointDateCalendar(
            @Field("date") String date,
            @Field("category_id") int categoryID
    );


//    /**
//     * 金刚区详情
//     *
//     * @param label_id 1早八点，2投融资，3今日大事件，4精选专题
//     */
//    @FormUrlEncoded
//    @POST("/getJingangDetails")
//    Observable<BasicListResponse<ArticleListResponse>> getJingangDetails(
//            @Field("label_id") int label_id,
//            @Field("page") int page,
//            @Field("size") int size
//    );

    /**
     * 浏览记录
     */
    @FormUrlEncoded
    @POST("/getHistoryList")
    Observable<BasicListResponse<HistoryListResponse>> getHistoryList(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 清除记录
     */
    @POST("/cleanHistory")
    Observable<BasicResponse<Object>> cleanHistory();

    /**
     * 我的收藏
     */
    @FormUrlEncoded
    @POST("/myCollection")
    Observable<BasicListResponse<CollectionListResponse>> myCollection(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 公告
     *
     * @param status 状态: 1正常 0隐藏
     */
    @FormUrlEncoded
    @POST("/getNoticeList")
    Observable<BasicListResponse<NoticeListResponse>> getNoticeList(
            @Field("status") int status,
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 提交反馈
     *
     * @param type 类型：1-功能建议；2-体验建议；3-内容建议；4-其他
     */
    @FormUrlEncoded
    @POST("/submitFeedback")
    Observable<BasicResponse<Object>> submitFeedback(
            @Field("type") int type,
            @Field("content") String content,
            @Field("name") String name,
            @Field("contact") String contact
    );

    /**
     * 历史反馈
     */
    @POST("/getFeedbackLog")
    Observable<BasicResponse<List<FeedbackResponse>>> getFeedbackLog();


    /**
     * 文章详情，相关推荐
     *
     * @param id 文章id
     */
    @FormUrlEncoded
    @POST("/relatedRecommen")
    Observable<BasicResponse<List<ArticleListResponse>>> relatedRecommend(
            @Field("id") String id
    );

    /**
     * 文章详情
     *
     * @param id 文章id
     */
    @FormUrlEncoded
    @POST("/getInformationDetails")
    Observable<BasicResponse<InformationDetailsResponse>> getInformationDetails(
            @Field("id") String id
    );

    /**
     * 热门专栏
     *
     * @param type 类型1作者2专栏
     */
    @FormUrlEncoded
    @POST("/getPopularColumn")
    Observable<BasicListResponse<HotColumnResponse>> getPopularColumn(
            @Field("type") int type,
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 主编推荐
     */
    @FormUrlEncoded
    @POST("/getRecommendLists")
    Observable<BasicListResponse<ArticleListResponse>> getRecommendLists(
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 他人发布的文章
     */
    @FormUrlEncoded
    @POST("/getUserInformation")
    Observable<BasicListResponse<ArticleListResponse>> getUserInformation(
            @Field("id") String id,
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 活动列表
     *
     * @param type 活动类型：1-峰会；2-系列活动；3-沙龙/论坛；4-培训；5-线上活动
     */
    @FormUrlEncoded
    @POST("/getActivityList")
    Observable<BasicListResponse<ActivityListResponse>> getActivityList(
            @Field("type") int type,
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 根据标签获取文章列表
     */
    @GET("/getLabelDetails")
    Observable<BasicListResponse<ArticleListResponse>> getLabelDetails(
            @Query("id") int id,
            @Query("page") int page,
            @Query("size") int size
    );

    /**
     * 我关注栏目的文章
     */
    @GET("/getFollowLists")
    Observable<BasicListResponse<ArticleListResponse>> getFollowLists(
            @Query("page") int page,
            @Query("size") int size
    );

    /**
     * 活动详情
     */
    @FormUrlEncoded
    @POST("/getActivityDetails")
    Observable<BasicResponse<ActivityListResponse>> getActivityDetails(
            @Field("id") int id
    );

    /**
     * app配置信息
     */
    @POST("/getAppConfig")
    Observable<BasicResponse<AppConfigResponse>> getAppConfig();

    /**
     * 搜索更多
     *
     * @param orderType 顺序：1-互动过最多；2-阅读最多，3最新发布
     * @param timeType  时间：1-一天内；2-一周内；3-一月内；4：三月内；5：一年内
     * @param type      1-文章；2-快讯；3-专题；4-专栏；5-活动
     */
    @FormUrlEncoded
    @POST("/searchMore")
    Observable<BasicListResponse<SearchResultResponse>> searchMore(
            @Field("key") String key,
            @Field("order_type") int orderType,
            @Field("time_type") int timeType,
            @Field("type") int type,
            @Field("page") int page,
            @Field("size") int size
    );

    /**
     * 搜索
     */
    @FormUrlEncoded
    @POST("/search")
    Observable<BasicResponse<SearchResponse>> search(
            @Field("key") String key,
            @Field("order_type") int orderType,
            @Field("time_type") int timeType
    );

    /**
     * 关注作者
     *
     * @param is_status 1-关注；0-取消关注
     */
    @FormUrlEncoded
    @POST("/followAuthor")
    Observable<BasicResponse<Object>> followAuthor(
            @Field("author_id") int author_id,
            @Field("is_status") int is_status
    );

    /**
     * 专栏详情
     */
    @FormUrlEncoded
    @POST("/getSpecialDetails")
    Observable<BasicResponse<SpecialDetailsResponse>> getSpecialDetails(@Field("id") int id);


    /**
     * 版本更新
     */
    @GET("/versionUpInfo")
    Observable<BasicResponse<VersionUpInfoResponse>> versionUpInfo();


    /**
     * 利好，利空，点赞
     *
     * @param id        文章｜快讯｜日历ID
     * @param is_status 类型：1-点赞（利好）；2-利空'
     */
    @FormUrlEncoded
    @POST("/likeInformation")
    Observable<BasicResponse<Object>> likeInformation(
            @Field("id") int id,
            @Field("is_status") int is_status,
            @Field("type") int type
    );

    /**
     * 微信登录
     */
    @GET("wechat/login")
    Observable<BasicResponse<UserDetailsResponse>> weChatLogin(@Query("code") String code);


    /**
     * 收藏资讯
     */
    @FormUrlEncoded
    @POST("/collectionInformation")
    Observable<BasicResponse<Object>> collectionInformation(
            @Field("information_id") int id
    );

    /**
     * 取消收藏资讯
     */
    @FormUrlEncoded
    @POST("/cancelCollectionInformation")
    Observable<BasicResponse<Object>> cancelCollectionInformation(
            @Field("information_id") int id
    );

    /**
     * 推送设置详情
     */
    @POST("/getUserNotice")
    Observable<BasicResponse<UserNoticeResponse>> getUserNotice();


    /**
     * 修改推送设置
     *
     * @param is_new_notice,     是否接收新信息通知：1-是；0-否
     * @param is_disturb,        是否开启免打扰：1-是；0否
     * @param disturb_start_time 免打扰开始时间
     * @param disturb_end_time   免打扰结束时间
     * @param is_article         是否开启文章通知；1-是；0-否
     * @param is_news_flash      是否开启快讯通知；1-是；0-否
     * @param is_notice,1        是否开启消息中心；1-是；0-否
     * @param is_author_update   是否开启作者更新通知；1-是；0-否
     */
    @FormUrlEncoded
    @POST("/updateUserNotice")
    Observable<BasicResponse<Object>> updateUserNotice(
            @Field("is_new_notice") String is_new_notice,
            @Field("is_disturb") String is_disturb,
            @Field("disturb_start_time") String disturb_start_time,
            @Field("disturb_end_time") String disturb_end_time,
            @Field("is_article") String is_article,
            @Field("is_news_flash") String is_news_flash,
            @Field("is_notice") String is_notice,
            @Field("is_author_update") String is_author_update,
            @Field("id") int id
    );

    /**
     * 修改关注用户推送设置
     *
     * @param id 作者id
     */
    @FormUrlEncoded
    @POST("/updateAuthorNotice")
    Observable<BasicResponse<Object>> updateAuthorNotice(
            @Field("id") int id,
            @Field("is_notice") int is_notice
    );


    /**
     * 我关注的
     */
    @FormUrlEncoded
    @POST("/getFollowList")
    Observable<BasicListResponse<FollowAuthorResponse>> getFollowList(
            @Field("page") int page,
            @Field("size") int size
    );


    /**
     * 申请注销
     */
    @POST("/logOff")
    Observable<BasicResponse<Object>> logOff();
}
